/*
https://flutter.cn/docs/get-started/flutter-for/android-devs

Widget 如何实现动画？
在 Android 中，你既可以通过 XML 文件定义动画，也可以调用 View 对象的 animate() 方法。在 Flutter 里，则使用动画库，通过将 Widget 嵌入一个动画 Widget 的方式实现 Widget 的动画效果。

Flutter 通过 Animation<double> 的子类 AnimationController 来暂停、播放、停止以及逆向播放动画。它需要一个 Ticker 在垂直同步 (vsync) 的时候发出信号，并且在运行的时候创建一个介于 0 和 1 之间的线性插值。然后你就可以创建一个或多个 Animation，并将它们绑定到控制器上。

例如，你可以使用 CurvedAnimation 来实现一个曲线插值的动画。在这种情况下，控制器决定了动画进度， CurvedAnimation 计算用于替换控制器默认线性动画的曲线值。与 Widget 一样，Flutter 中的动画效果也可以组合使用。

在构建 Widget 树的时候，你需要将 Animation 对象赋值给某个 Widget 的动画属性，例如FadeTransition 的不透明度属性，并让控制器开始动画。

下面的例子展示了如何实现一个点击 FloatingActionButton 时将一个 Widget 渐变为一个图标的 FadeTransition：

 */

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const FadeAppTest());
}

class FadeAppTest extends StatelessWidget {
  const FadeAppTest({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Fade Dem',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: const MyFadeTest(title: 'Widget 如何实现动画'),
    );
  }
}

class MyFadeTest extends StatefulWidget {
  final String title;

  const MyFadeTest({super.key, required this.title});

  @override
  State<StatefulWidget> createState() => _MyFadeTestState();
}

class _MyFadeTestState extends State<MyFadeTest> with TickerProviderStateMixin {
  late AnimationController controller;
  late CurvedAnimation curve;

  @override
  void initState() {
    super.initState();
    controller = AnimationController(
      duration: const Duration(milliseconds: 2000),
      vsync: this,
    );
    curve = CurvedAnimation(parent: controller, curve: Curves.easeIn);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(widget.title)),
      body: Center(
        child: FadeTransition(
          opacity: curve,
          child: const FlutterLogo(
            size: 100.0,
          ),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        tooltip: 'Fade',
        onPressed: () {
          controller.forward();
        },
        child: const Icon(Icons.brush),
      ),
    );
  }
}
